package com.baidu.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.baidu.constant.MessageConstant;
import com.baidu.constant.RedisConstant;
import com.baidu.entity.PageResult;
import com.baidu.entity.QueryPageBean;
import com.baidu.entity.Result;
import com.baidu.mapper.SetMealMapper;
import com.baidu.pojo.Setmeal;
import com.baidu.service.SetMealService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import redis.clients.jedis.JedisPool;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass =SetMealService.class )
@Transactional
public class SetMealServiceImpl implements SetMealService {

	@Autowired
	private SetMealMapper setMealMapper;

	@Autowired
	private JedisPool jedisPool;

	@Autowired
	private FreeMarkerConfigurer freeMarkerConfigurer;

@Value("${out_put_path}")
	private String outputpath;




	@Override
	public void addSetMeal(Integer[] checkgroupIds, Setmeal setmeal) {
//		先添加套餐组信息，mybatis会获得一个自增的主键，
		setMealMapper.addSetMeal(setmeal);


		//根据获得主键。再使用map集合往里面添加套餐与检查组的关联关系。

		this.setGroupId_setMealId(checkgroupIds,setmeal);

		//添加有效图片进缓存
		this.addPicture(RedisConstant.ACTUAL_PICTURE,setmeal.getImg());//此时的image已经有名称，因为是从前端封装过来的。


		//新增完之后。当前页面所要生成的静态页面的方法。
		genarateMobileStaticHtml();
	}

	//分页
	@Override
	public PageResult pageQuery(QueryPageBean queryPageBean) {
//先开启分页助手
		PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());

		//通过一个查询语句获得分页对象
		Page<Setmeal> page =setMealMapper.findPage(queryPageBean.getQueryString());

		//获得分页对象里面的参数

		return new PageResult(page.getTotal(),page.getResult());

	}

	/**
	 * 查询所有套餐信息
	 * @return List<Setmeal>
	 */

	@Override
	public List<Setmeal> findAll() {
		return setMealMapper.findAll();


	}

	/**
	 * 根据套餐id查询套餐基本信息，检查组信息，检查项信息
	 * @param id 套餐id
	 * @return Setmeal
	 */

	@Override
	public Setmeal findById(Integer id) {
		return setMealMapper.findById(id);
	}

	/**
	 * 只查询套餐的基本信息
	 * @param id 套餐id
	 * @return Setmeal
	 */

	@Override
	public Setmeal findByIdOnlySetmeal(Integer id) {
		return setMealMapper.findByIdOnlySetmeal(id);
	}

	/**
	 * 查寻所有会员所选择的套餐是占比
	 * @return List<Map<String, Object>>
	 */
	@Override
	public List<Map<String, Object>> findSetMealCount() {
		return setMealMapper.findSetMealCount();
	}

	/**
	 * 根据指定的套餐查询查询其所拥有的检查组id
	 * @param id 套餐id
	 * @return
	 */

	@Override
	public List<Integer> showCgidBySid(Integer id) {
		return setMealMapper.findCgidBySid(id);
	}

	/**
	 * 根据指定id删除套餐,如果该id已被用户预约，无法删除。
	 * 若未被预约，先删除中间关系表，再删除套餐
	 * @param id
	 * @return
	 */

	@Override
	public Result delete(Integer id) {
		Integer count = setMealMapper.findUserById(id);
		if(count == 0){//说明该套餐没有被预约
			try {
				setMealMapper.deleteCgAndSm(id);
				setMealMapper.deleteSmByid(id);
			} catch (Exception e) {
				e.printStackTrace();
				return new Result(false, MessageConstant.DELETE_SETMEAL_FALL);
			}
			return new Result(true, MessageConstant.DELETE_SETMEAL_SUCCESS);
		}else {//说明该套餐已被预约
			return new Result(false,"该套餐已被用户预约，不能删除");
		}

	}

	/**
	 * 通过套餐基础信息和检查组id数组修改套餐信息
	 * @param setmeal
	 * @param checkgroupIds
	 * @return
	 */

	@Override
	public Result edit(Setmeal setmeal, Integer[] checkgroupIds) {
		Integer sId = setmeal.getId();
		Integer num = setMealMapper.findUserById(sId);
		//修改基本套餐信息
		setMealMapper.update(setmeal);
		if(num == 0) {
			setMealMapper.deleteCgAndSm(sId);
			for (Integer checkgroupId : checkgroupIds) {
				try {
					setMealMapper.addCgAngSm(checkgroupId,sId);
				} catch (Exception e) {
					e.printStackTrace();
					return new Result(false,MessageConstant.EDIT_SETMEAL_FALL);
				}
			}
		}else {
			return new Result(false,"当前套餐已被用户预约，无法修改");
		}
		return new Result(true,MessageConstant.EDIT_SETMEAL_SUCCESS);
	}

	/**
	 * 添加图片
	 */

	private void addPicture(String key,String value){

		jedisPool.getResource().sadd(key,value);
	}

	private void setGroupId_setMealId(Integer []checkgroupIds,Setmeal setmeal ){
		if (checkgroupIds.length>0 && checkgroupIds != null) {
			HashMap<String ,Integer> hashMap ;

			for (Integer checkgroupId : checkgroupIds) {

				hashMap=new HashMap<>();
//				我要放一个套餐的id，还有检查组的id
				hashMap.put("setmeal_id",setmeal.getId());
				hashMap.put("checkgroup_id",checkgroupId);

				setMealMapper.addSetmeal_idAndCheckgroup_id(hashMap);

			}
		}
	}


	/**
	 * 通用的静态页面
	 * @param templateName
	 * @param staticHtmlName
	 * @param map ：需要封装的模型数据
	 */
	public void genarateHtml(String templateName, String staticHtmlName, Map map){

		Configuration configuration = freeMarkerConfigurer.getConfiguration();
		Writer writer=null;
		try {
			Template template = configuration.getTemplate(templateName);
template.setEncoding("utf-8");
			//生成静态页面存放的位置
			File file = new File(outputpath + "/" + staticHtmlName);
			writer  = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
		//输出文件
			template.process(map,writer);
		writer.close();
		} catch (Exception e) {
	e.printStackTrace();

		}


	}


	//生成当前方法所需的静态页面
	public void genarateMobileStaticHtml(){

		//在生成静态页面之前需要插叙全部数据
		List<Setmeal> list = setMealMapper.findAll();

		//需要生成套餐列表的静态页面 (所需模型数据是一个集合)
				genarateMobileSetMealListHtml(list);

		//需要生成套餐详情的静态页面(所需模型数据是集合中的泛型，意思有多个套餐详情)
				genarateMobileSetMealDetailHtml(list);

	}
//列表
	public void genarateMobileSetMealListHtml(List<Setmeal> setmealList){
		Map map = new HashMap();
		map.put("setmealList",setmealList);
//调用通用静态页面
		 genarateHtml("mobile_setmeal.ftl","m_setmeal.html",map);

	}

//	详情
	public void genarateMobileSetMealDetailHtml(List<Setmeal> setmealList){


		HashMap hashMap=null;
		for (Setmeal setmeal : setmealList) {
			hashMap= new HashMap();
			hashMap.put("setmeal",setMealMapper.findById(setmeal.getId()));

			genarateHtml("mobile_setmeal_detail.ftl","setmeal_detail_"+setmeal.getId()+".html",hashMap);

		}

	}





}
